
//通过懒汉模式实现单例模式
/*就是在非必要的时候不去创建实例，先让instance不去指向任何对象
* 当调用get一个实例的这个方法时再去new一个对象，同样的如果这个对象不为空
* 就不再去创建了*/
/*问：单例模式的饿汉模式和懒汉模式在多线程的情况下是否是安全的？？
* 答:  饿汉模式是安全的，懒汉模式是不安全的，问题就出在if这个判定
*      和new对象这个操作不是原子性的，在多线程情况下可能同时执行if
*      同时是null就会同时创建两个对象*/
/*解决方案： 加锁，但是加锁就意味着效率的降低，如果在get方法加锁，以后每次调用get方法
           都可能进行锁竞争，可以看下只有在首次创建对象的时候是
*          需要加锁的，只要对象创建出来，后面就不用加锁了，所以再判断下是否需要枷锁的
            情况*/
class SingletonLazy {
    private static SingletonLazy instance = null;

    public static SingletonLazy getInstance() {
        //这个条件判定是否需要加锁，如果对象已经new出来了，就不用加锁了
        if (instance == null) {
            synchronized (SingletonLazy.class) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy() { }
}
public class ThreadDemo20 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1 == s2);
    }
}
